以下內容皆參考 Backtrader 官網
有了策略可以讓我們進行評估,有了歷史資料可以進行回測,加上 Backtrader 有 trade_notify, order_notify,我們可以看到每筆交易的價格,如果要進行策略優化,也有 stop 這個事件,可以在執行完策回測後進行回報成果,基本上這樣就結束了...嗎?如果只是程式在跑,的確是結束了,不過人是視覺的動物,所以補上繪圖這一塊才算是完整。
在之前就有大概介紹過如何進行繪圖,今天再說明仔細一點,Backtrader 的繪圖指令很簡單,只有一行:
cerebro.plot()
它就會自動繪出以下的資料:
datafeed 的部份,不管是使用 adddata, resampledata, replaydata 都會新增一筆資料,也會在繪圖的時候一併顯示。
指標的話,就是在 init 的地方,我們可以新增指標,不管有沒有指定變數,只要我們有初始化,那就會顯示
def __init__(self):
    self.sma_short = btind.SimpleMovingAverage(period = 5)
    self.sma_long = btind.SimpleMovingAverage(period = 30)
    # 或者不指定變數
    # btind.SimpleMovingAverage(period = 5)
    # btind.SimpleMovingAverage(period = 30)
如果還有記得第一天,我們在初始化 cerebro 的時候是這樣子的
cerebro = bt.Cerebro(stdstats=False)
# 也可以在執行的時候指定
# cerebro.run(stdstats=False)
stdstats 指的就是上面 3 個基本的 observers,所以第一天畫出來的圖,並沒有 observers 的資訊。
我們以一段簡單的策略來示範:
import backtrader as bt
import backtrader.indicators as btind
import backtrader.feeds as btfeeds
class St(bt.Strategy):
    def __init__(self):
        self.sma_short = btind.SimpleMovingAverage(period = 5)
        self.sma_long = btind.SimpleMovingAverage(period = 30)
data = btfeeds.PandasData(dataname=df, timeframe=bt.TimeFrame.Minutes)
cerebro = bt.Cerebro(stdstats=True)
cerebro.resampledata(data, timeframe=bt.TimeFrame.Days)
cerebro.addstrategy(St)
cerebro.run()
cerebro.plot()

上面的2個圖就是,現金/收益, 買進/賣出,下面最主要的圖就是 datafeed/指標,之前說過指標也是以 line 的型式在儲存資料,所以可以在這上面畫出一條線來,要加畫線的話,可以在 init 增加我們的指標,而且不一定要指定變數。像是這樣
在繪制 indicators 和 observers 的時候,有一些選項可以進行細部設定選項如下所例:
設定的方法有 2 種:
# 在初始化 indicators 時指定 kwargs
btind.SimpleMovingAverage(period = 5, plot = False)
# 在初始化後,依照指定的變數設定
sma = btind.SimpleMovingAverage(period = 5)
sma.plotinfo.plot = False
def plot(self, plotter=None, numfigs=1, iplot=True, **kwargs):
class PlotScheme(object):
    def __init__(self):
        # to have a tight packing on the chart wether only the x axis or also
        # the y axis have (see matplotlib)
        self.ytight = False
        # y-margin (top/bottom) for the subcharts. This will not overrule the
        # option plotinfo.plotymargin
        self.yadjust = 0.0
        # Each new line is in z-order below the previous one. change it False
        # to have lines paint above the previous line
        self.zdown = True
        # Rotation of the date labes on the x axis
        self.tickrotation = 15
        # How many "subparts" takes a major chart (datas) in the overall chart
        # This is proportional to the total number of subcharts
        self.rowsmajor = 5
        # How many "subparts" takes a minor chart (indicators/observers) in the
        # overall chart. This is proportional to the total number of subcharts
        # Together with rowsmajor, this defines a proportion ratio betwen data
        # charts and indicators/observers charts
        self.rowsminor = 1
        # Distance in between subcharts
        self.plotdist = 0.0
        # Have a grid in the background of all charts
        self.grid = True
        # Default plotstyle for the OHLC bars which (line -> line on close)
        # Other options: 'bar' and 'candle'
        self.style = 'line'
        # Default color for the 'line on close' plot
        self.loc = 'black'
        # Default color for a bullish bar/candle (0.75 -> intensity of gray)
        self.barup = '0.75'
        # Default color for a bearish bar/candle
        self.bardown = 'red'
        # Level of transparency to apply to bars/cancles (NOT USED)
        self.bartrans = 1.0
        # Wether the candlesticks have to be filled or be transparent
        self.barupfill = True
        self.bardownfill = True
        # Wether the candlesticks have to be filled or be transparent
        self.fillalpha = 0.20
        # Wether to plot volume or not. Note: if the data in question has no
        # volume values, volume plotting will be skipped even if this is True
        self.volume = True
        # Wether to overlay the volume on the data or use a separate subchart
        self.voloverlay = True
        # Scaling of the volume to the data when plotting as overlay
        self.volscaling = 0.33
        # Pushing overlay volume up for better visibiliy. Experimentation
        # needed if the volume and data overlap too much
        self.volpushup = 0.00
        # Default colour for the volume of a bullish day
        self.volup = '#aaaaaa'  # 0.66 of gray
        # Default colour for the volume of a bearish day
        self.voldown = '#cc6073'  # (204, 96, 115)
        # Transparency to apply to the volume when overlaying
        self.voltrans = 0.50
        # Transparency for text labels (NOT USED CURRENTLY)
        self.subtxttrans = 0.66
        # Default font text size for labels on the chart
        self.subtxtsize = 9
        # Transparency for the legend (NOT USED CURRENTLY)
        self.legendtrans = 0.25
        # Wether indicators have a leged displaey in their charts
        self.legendind = True
        # Location of the legend for indicators (see matplotlib)
        self.legendindloc = 'upper left'
        # Plot the last value of a line after the Object name
        self.linevalues = True
        # Plot a tag at the end of each line with the last value
        self.valuetags = True
        # Default color for horizontal lines (see plotinfo.plothlines)
        self.hlinescolor = '0.66'  # shade of gray
        # Default style for horizontal lines
        self.hlinesstyle = '--'
        # Default width for horizontal lines
        self.hlineswidth = 1.0
        # Default color scheme: Tableau 10
        self.lcolors = tableau10
        # strftime Format string for the display of ticks on the x axis
        self.fmt_x_ticks = None
        # strftime Format string for the display of data points values
        self.fmt_x_data = None
另外,繪圖的設定選項還有在 indicators|observers 裡設定,不過這裡要知道怎麼自訂義 indicators|observers,因為我還沒有分享到這,所以暫時就不分享這部份,之後如果有時間,再來補充